package cn.psvmc.cxzapi.util;

import lombok.extern.slf4j.Slf4j;

import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Description 编码生成工具类
 * @Author YWX
 * @Date 2024/8/21 10:25
 **/
@Slf4j
public class CodeUtil {

    private static final AtomicInteger billSequence = new AtomicInteger(1); // 当天的流水号顺序
    private static final AtomicInteger orderSequence = new AtomicInteger(1); // 当天的流水号顺序
    private static final AtomicInteger goodsSequence = new AtomicInteger(1); // 当天的流水号顺序
    private static final AtomicInteger outerOrderNoSequence = new AtomicInteger(1); // 当天的支付宝流水号顺序
    private static String today = ToolUtils.getNowDateFormat("yyyyMMdd");

    /**
     * @Description 生成流水号
     * 前8位：当前日期（yyyyMMdd）
     * 接下来的6位：当天的顺序号（从000001开始递增）
     * 最后的5位：随机数（保证同一秒内的唯一性）
     * @Date 2024/8/21 9:48
     * @Author YWX
     * @Param []
     * @Return java.lang.String
     **/
    public static synchronized String generateSequence(AtomicInteger sequence) {
        String currentDate = ToolUtils.getNowDateFormat("yyyyMMdd");
        if (!currentDate.equals(today)) { // 检查是否新的一天
            today = currentDate;
            sequence.set(1); // 重置序号
        }else {
            sequence.incrementAndGet(); // 递增序号
        }

        // 获取当天的序列号
        String sequenceStr = String.format("%06d", sequence.get());

        // 生成随机数部分
        Random random = new Random();
        String randomPart = String.format("%05d", random.nextInt(100000));

        return today + sequenceStr + randomPart;
    }

    /**
     * @Description 生成优惠券码
     * 前6位：当前日期（yyMMdd）
     * 后6位：6位随机数
     * @Date 2024/8/21 10:12
     * @Author YWX
     * @Param []
     * @Return java.lang.String
     **/
    public static String generateCouponCode() {
        // 获取当前日期的字符串形式
        String currentDate = ToolUtils.getNowDateFormat("yyMMdd");

        // 生成6位随机数
        Random random = new Random();
        String randomPart = String.format("%06d", random.nextInt(1_000_000));

        return currentDate + randomPart;
    }

    /**
     * @Description 生成订单流水号
     * @Date 2024/8/21 10:39
     * @Author YWX
     * @Param []
     * @Return java.lang.String
     **/
    public static synchronized String generateBillSequence() {
        return generateSequence(billSequence);
    }

    /**
     * @Description 生成订单号
     * @Date 2024/8/21 10:39
     * @Author YWX
     * @Param []
     * @Return java.lang.String
     **/
    public static synchronized String generateOrderCode() {
        return generateSequence(orderSequence);
    }

    /**
     * @Description 生成商品编码
     * @Date 2024/8/21 10:45
     * @Author YWX
     * @Param []
     * @Return java.lang.String
     **/
    public static synchronized String generateGoodsCode() {
        return generateSequence(goodsSequence);
    }

    /**
     * @Description 生成支付宝流水号
     * 前8位：当前日期（yyyyMMdd）
     * 接下来的6位：当天的顺序号（从000001开始递增）
     * 最后的8位：随机数（保证同一秒内的唯一性）
     * @Date 2024/9/25 21:48
     * @Author YWX
     * @Param []
     * @Return java.lang.String
     **/
    public static synchronized String generateOuterOrderNo() {

        String currentDate = ToolUtils.getNowDateFormat("yyyyMMdd");
        if (!currentDate.equals(today)) { // 检查是否新的一天
            today = currentDate;
            outerOrderNoSequence.set(1); // 重置序号
        } else {
            outerOrderNoSequence.incrementAndGet(); // 递增序号
        }

        // 获取当天的序列号
        String sequenceStr = String.format("%06d", outerOrderNoSequence.get());

        // 生成随机数部分
        Random random = new Random();
        String randomPart = String.format("%08d", random.nextInt(100000));

        return today + sequenceStr + randomPart;
    }
}
